package com.inifitness.sms.utils;

import com.inifitness.sms.service.AliCloudSmsService;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.util.StringUtils;

/**
 * SMS 短信计算工具
 * 阿里云短信长度计算规则 短信内容长度计算规则 短信长度（字数）＝短信签名字数+短信模板内容字数。其中，短信模板字数上限为500字。 国内短信
 * 简体中文、字母、数字、标点符号（不区分全角和半角），都按照一个字计算。
 * <p>
 * 短信长度不超过70个字，按照一条短信计费；超过70个字，即为长短信，按照67字/条拆分成多条计费。
 * <p>
 * 示例：短信长度为160个字，按照67字、67字、26字分隔成三条短信进行计费。
 * <p>
 * 国际/港澳台短信 纯英文短信 字母、数字、标点符号（不区分全角和半角），都按照一个字计算。
 * <p>
 * 当短信长度不超过160字时，按照1条短信计费。超过160字时为长短信，按153字/条分隔成多条计费。
 * <p>
 * 示例：短信长度为350字，按照153字、153字、44字分隔成三条短信进行计费。
 * <p>
 * 非纯英文短信 汉字、字母、数字、标点符号（不区分全角/半角）以及空格等，都按一个字计算。
 * <p>
 * 当短信长度不超过70字时，按照1条短信计费。超过70字时为长短信，按67字/条分隔成多条计费。
 * <p>
 * 示例：短信长度为150字，按照67字、67字、16字分隔成三条短信进行计费。
 * @author haichengge
 * @version  1.0.
 * @since 2023/10/25 16:41
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class SmsUtils {
  public static final int SMS_CN_INIT_SUB_SIZE = 70;
  public static final int SMS_CN_SUB_SIZE = 67;
  public static final int SMS_INT_INIT_SUB_SIZE = 160;
  public static final int SMS_INT_SUB_SIZE = 153;
  public static final String PREFIX = "【";
  public static final String SUFFIX = "】";
  /**
   * 获取短信条数
   * @param content 短信内容
   * @param sign 短信签名
   * @return 短信条数
   */
  public static int getSmsNum(String content, String sign) {
    StringBuilder smsContentBuilder = new StringBuilder();
    smsContentBuilder.append(PREFIX).append(sign).append(SUFFIX).append(content);
    int length = smsContentBuilder.length();
    if (length <= SMS_CN_INIT_SUB_SIZE) {
      return 1;
    } else {
      if (length % SMS_CN_SUB_SIZE > 0) {
        return length / SMS_CN_SUB_SIZE + 1;
      }
      return length / SMS_CN_SUB_SIZE;
    }
  }

  /**
   * 获取短信对象
   * @param sign 短信签名
   * @param mobile 手机号
   * @param jsonParams 请求参数
   * @return 短信对象
   */
  public static AliCloudSmsService.Message getMessage(String sign, String mobile,
      String jsonParams) {
    AliCloudSmsService.Message message = new AliCloudSmsService.Message(mobile, sign);
    if (StringUtils.hasText(jsonParams)) {
      JSONObject jsonObject = JSONUtil.parseObj(jsonParams);
      jsonObject.forEach((key, value) -> message.addParameter(key, value.toString()));
    }
    return message;
  }
}
